#include "list.h"
#include <QVariantList>

List::List(QObject *parent) : QAbstractListModel(parent)
{
    std::vector<std::any> post;
    MyFunc* f=new MyFunc;
    f->myexpr="y=x^(2/3)+0.9*(3.3-x*x)^(1/2)*sin(55*pi*x)";
    f->mycolor="#F00";
    Analyse::getPostfix(f->myexpr,post);
    f->mypostExpr=post;
    f->calculate();
    addFunc(f);

    f=new MyFunc;
    f->myexpr="y=(-x)^(2/3)+0.9*(3.3-x*x)^(1/2)*sin(-55*pi*x)";
    f->mycolor="#F00";
    Analyse::getPostfix(f->myexpr,post);
    f->mypostExpr=post;
    f->calculate();
    addFunc(f);
}

//返回模型中的行数
//rowCount()函数是QAbstractListModel中的一个纯虚函数，子类必须实现它以提供模型的行数信息
int List::rowCount(const QModelIndex &parent) const
{
    //parent参数表示父项的索引，如果模型是一个单层列表，则parent参数始终为无效的
    if (parent.isValid())
        return 0;
    return funcList.size();
}

//返回模型中给定索引的数据
QVariant List::data(const QModelIndex &index, int role) const//不需要手动调用，Qt框架在需要时自动调用
{
    //如果传入的索引index无效，则返回一个空的QVariant对象
    if (!index.isValid())
    {
        return {};
    }
    int nRow = index.row();//该引索的行数-1
    if (nRow >= rowCount() || nRow < 0)//不能等于
        //索引是从0开始计数的。如果nRow等于rowCount()，说明索引指向的是一个不存在的行，因此返回空的QVariant对象表示数据无效
    {
        return {};
    }
    switch (role)
    {
        case Qt::DisplayRole://数据在视图中的显示方式
            return QString(QString::fromStdString(funcList[nRow]->myexpr));
    }
    return {};
}

void List::addFunc(MyFunc *func)
{
    int row = funcList.size();
    beginInsertRows(QModelIndex(), row, row);//在指定的row索引处插入行
    this->funcList.push_back(func);
    endInsertRows();//通知连接的任何视图插入已完成
}

List::~List()
{
    for (auto &i: funcList)
    {
        delete i;
        i= nullptr;
    }
}

//删除一个指定行数的 MyFunc 对象，并且更新与视图
void List::rmFunc(int row)//删除row行
{
    if (row < funcList.size())
    {
        beginRemoveRows(QModelIndex(), row, row);
        MyFunc *f = funcList[row];
        funcList.erase(funcList.begin() + row);
        delete f;
        endRemoveRows();//告知该操作已完成，以便相应的视图可以更新显示
    }
}
